package com.banyou.banyou.webutils;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.View;

import com.banyou.banyou.bean.BaseBean;
import com.banyou.banyou.bean.CodeBean;
import com.banyou.banyou.util.SnackBarUtil;
import com.socks.library.KLog;

import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.concurrent.TimeoutException;

import retrofit2.adapter.rxjava.HttpException;
import rx.Subscriber;


/**
 * ----------Dragon be here!----------/
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑
 * 　　　　┃　　　┃代码无BUG！
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━神兽出没━━━━━━
 * 项目名称：WheelMedical
 * 包名:com.yyxk.wheelmedical.webutils
 * 类描述：
 * 创建人：Random
 * 创建时间：11:20
 * 修改人：Random
 * 修改时间：11:20
 * 修改备注： 用于在Http请求开始时，自动显示一个ProgressDialog
 * 在Http请求结束是，关闭ProgressDialog
 * 调用者自己对请求数据进行处理
 */
public class ProgressSubscriber<T> extends Subscriber<T> implements ProgressCancelListener {
    public SubscriberOnErrorListener mSubscriberOnErrorListener;
    public SubscriberOnNextListener mSubscriberOnNextListener;
    private ProgressDialogHandler mProgressDialogHandler;
    private boolean canShowDialog, showToast = true;
    public Context context;

    public ProgressSubscriber(SubscriberOnNextListener mSubscriberOnNextListener, Context context, boolean canShowDialog, SubscriberOnErrorListener mSubscriberOnErrorListener) {
        this.mSubscriberOnNextListener = mSubscriberOnNextListener;
        this.context = context;
        this.canShowDialog = canShowDialog;
        this.mSubscriberOnErrorListener = mSubscriberOnErrorListener;
        mProgressDialogHandler = new ProgressDialogHandler(context, this, false);
    }

    public ProgressSubscriber(SubscriberOnNextListener mSubscriberOnNextListener, Context context, boolean canShowDialog) {
        this.mSubscriberOnNextListener = mSubscriberOnNextListener;
        this.context = context;
        this.canShowDialog = canShowDialog;
        mProgressDialogHandler = new ProgressDialogHandler(context, this, false);
    }

    public ProgressSubscriber(SubscriberOnNextListener mSubscriberOnNextListener, Context context, boolean canShowDialog, SubscriberOnErrorListener mSubscriberOnErrorListener, boolean showToast) {
        this.mSubscriberOnNextListener = mSubscriberOnNextListener;
        this.context = context;
        this.canShowDialog = canShowDialog;
        this.mSubscriberOnErrorListener = mSubscriberOnErrorListener;
        mProgressDialogHandler = new ProgressDialogHandler(context, this, false);
        this.showToast = showToast;
    }

    /**
     * 显示Dialog
     */
    private void showProgressDialog() {
        if (mProgressDialogHandler != null && canShowDialog) {
            mProgressDialogHandler.setContext(context);
            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.SHOW_PROGRESS_DIALOG).sendToTarget();
        }
    }

    /**
     * 取消Dialog
     */
    private void dismissProgressDialog() {
        if (mProgressDialogHandler != null && canShowDialog) {
            context = null;
            mProgressDialogHandler.obtainMessage(ProgressDialogHandler.DISMISS_PROGRESS_DIALOG).sendToTarget();
            mProgressDialogHandler = null;
        }
    }

    /**
     * 订阅开始时调用
     * 显示ProgressDialog
     */
    @Override
    public void onStart() {
        showProgressDialog();
    }

    /**
     * 完成，隐藏ProgressDialog
     */
    @Override
    public void onCompleted() {
        dismissProgressDialog();
    }

    /**
     * 对错误进行统一处理
     * 隐藏ProgressDialog
     *
     * @param e
     */
    @Override
    public void onError(Throwable e) {
        if (showToast) {
            //公共网络错误处理
            if (e instanceof SocketTimeoutException) {
                SnackBarUtil.makeSnackBar("链接失败");
            } else if (e instanceof ConnectException) {
                SnackBarUtil.makeSnackBar("网络中断，请检查您的网络状态");
            } else if (e instanceof TimeoutException) {
                SnackBarUtil.makeSnackBar("链接失败");
            } else if (e instanceof HttpException) {
                SnackBarUtil.makeSnackBar("无法连接到服务器");
            } else if (e instanceof UnknownHostException) {
                SnackBarUtil.makeSnackBar("无法连接到服务器");
            } else {
                Log.i("tagggg", "error:" + e.getCause());
                Log.i("taggggg", "error:" + e.getMessage());
                e.printStackTrace();
                //其他异常处理交由onError()处理
                if (mSubscriberOnErrorListener != null) {
                    mSubscriberOnErrorListener.onError();
                }
            }
            KLog.a("error===>" + e.getMessage());
        }
        //所有异常交由onError(Throwable e)处理
        if (mSubscriberOnErrorListener != null) {
            mSubscriberOnErrorListener.onError(e);
        }
        dismissProgressDialog();
        context = null;
    }


    /**
     * 将onNext方法中的返回结果交给Activity或Fragment自己处理
     * 若返回的Bean类型为CodeBean且code！=1或者code！=0，则判断为请求出错
     *
     * @param t 创建Subscriber时的泛型类型
     */
    @Override
    public void onNext(T t) {
        //判断data是否为CodeBean
        if (t instanceof CodeBean && !((CodeBean) t).isSuccess()) {
            KLog.a("isSuccess="+((CodeBean) t).isSuccess());
            String errorMsg = ((CodeBean) t).getErrors().getErrMsg();
            KLog.a("errorMsg="+((CodeBean) t).getErrors().getErrMsg());
            if (mSubscriberOnErrorListener != null) {
                if (errorMsg != null) {
                    KLog.a("requestErrorCode=============>" + errorMsg);
                    mSubscriberOnErrorListener.onError(new ReturnCodeErrorException(((CodeBean) t).getCode(), errorMsg));
                    return;
                }else{
                    mSubscriberOnErrorListener.onError();
                    return;
                }
//                mSubscriberOnErrorListener.onError();
//                return;
            }
        }
        //如果code=1，无论data是否为null，都会走onNext()
        if (mSubscriberOnNextListener != null) {
            mSubscriberOnNextListener.onNext(t);
        }
    }


    /**
     * 取消ProgressDialog的时候，取消对observable的订阅，同时也取消了http请求
     */
    @Override
    public void onCancelProgress() {
        if (!this.isUnsubscribed()) {
            this.unsubscribe();
        }
    }

    /**
     * 只是保存了错误Code
     */
    public static class ReturnCodeErrorException extends Exception {
        int code;
        String msg;

        public ReturnCodeErrorException(int code, String msg) {
            this.code = code;
            this.msg = msg;
        }

        public ReturnCodeErrorException(String message, int code) {
            super(message);
            this.code = code;
        }

        public void setCode(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }
    }
}